package ca.etsmtl.log430.lab3;

import java.util.Observable;

/**
 * Upon notification, this class first lists the students and asks the user to
 * pick a student and enter the student's ID. If the student's ID is valid, then
 * the courses that the student has registered for will be listed.
 * 
 * @author A.J. Lattanze, CMU
 * @version 1.2, 2011-Feb-24
 */

/*
 * Modification Log **********************************************************
 * 
 * v1.2, R. Champagne, 2011-Feb-24 - Various refactorings, conversion of
 * comments to javadoc format.
 * 
 * v1.1, R. Champagne, 2002-Jun-19 - Adapted for use at ETS.
 * 
 * v1.0, A.J. Lattanze, 12/29/99 - Original version.
 * ***************************************************************************
 */

public class ListCoursesRegistered extends Communication implements Runnable {
	boolean Stop = false;

	public ListCoursesRegistered(Integer RegistrationNumber,
			String ComponentName) {
		super(RegistrationNumber, ComponentName);

	} // Constructor

	@Override
	public void update(Observable Thing, Object NotificationNumber) {
		Menus Menu = new Menus();
		Displays Display = new Displays();
		Student MyStudent = new Student();

		// The update() method is an abstract method that is called whenever the
		// notifyObservers() method is called by the Observable class
		// First we check to see if the NotificationNumber is equal to this
		// thread's RegistrationNumber or SYSTEM_SHUT_DOWN. If they are, then we
		// execute - otherwise, we stay idle.

		if (registrationNumber.compareTo((Integer) NotificationNumber) == 0) {
			// First we use a Displays object to list all of the students. Then
			// we
			// ask the user to pick a student using a Menus object.

			addToReceiverList("ListStudentsComponent");

			signalReceivers("ListStudentsComponent");

			MyStudent = Menu
					.pickStudent(CommonData.theListOfStudents.listOfStudents);

			// If the user selected an invalid student, then a message is
			// printed to the
			// terminal.

			if (MyStudent != null) {
				Display.displayStudentCoursesRegistered(MyStudent);

			} else {

				System.out.println("\n\n *** Student not found ***");

			} // if

		} // if

		if (SYSTEM_SHUT_DOWN_ID.compareTo((Integer) NotificationNumber) == 0) {
			Stop = true;

		} // if

		removeFromReceiverList("ListStudentsComponent");

	} // update

	public void run() {
		System.out.println("\nListCoursesRegistered Component Started...");

		try {
			while (!Stop) {

				// Note this is something of a farce here. In order to start
				// each
				// component as a separate thread, the run() method must be
				// implemented.
				// To illustrate how run() could be used here I put some code
				// here.We really
				// don't do anything here,.. but we could. If we were doing
				// things here,
				// whatever it was that we were doing would be interrupted when
				// an event
				// from the executive arrived, and the update() method we would
				// immediately
				// execute. Currently we wait forever (by 1 second increments).
				// Please feel
				// free to put code if if you thing you need to (not to imply
				// that you will
				// need to).

				Thread.sleep(1000);

			} // while

			System.out.println("\nListCoursesRegistered Component Shutdown...");

		} catch (Exception e) {

			System.out
					.println("Exception occured in ListCoursesRegistered.run(): "
							+ e);

		} // try-catch

	} // run
} // ListCoursesRegistered